package View;

import Controller.Controller;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 * Klasa która odpowiada za menu konfiguracyjne.
 * @param controller - referencja na kontroler. 
 * @param view - referencja na widok.
 * @param menu - okno głowne konfiguracji.
 * @param credentials - label informujacy o przeznaczeniu pola wyboru pliku z danymi dostępowymi.
 * @param credentialsPath - ścieżka do pliku z danymi dostępowymi.
 * @param selectButton - guzik wyboru pliku pliku.
 * @param acceptButton - guzik do zatwierdzania konfiguracji.
 * @param downloadLabel - label informujacy o oknie pobierania.
 * @param icon - ikona przycisku wybierania pliku.
 * @param downloadPath - ścieżka do domyślnego katalogu pobierania.
 * @param downloadSelectButton - przycisk wyboru domyśknego katalogu pobierania.
 * @param chooser - okno odpowiadające za wyborów pliku / katalogu z dysku lokalnego.
 * @param cancel - anulowanie zmian w konfiguracji.
 * @param tabbedPane - layout odpowiadający za zakładki.
 * @param layout - border layout.
 * @param card1 - piersza zakładka.
 * @param card2 - druga zakładka.
 * @param bottom - panel w którym są umieszczone przycisku do zatwierdzenia i anulowania zmien w konfiguracji.
 */
public class ConfigMenu {

    final private Controller controller;
    final private View view;
    private JDialog menu;
    private JLabel credentials;
    private JTextField credentialsPath;
    private JButton selectButton;
    private JButton acceptButton;
    private JLabel downloadLabel;
    private Icon icon;
    final private JTextField downloadPath;
    private JButton downloadSelectButton;
    private JFileChooser chooser;
    private JButton cancel;
    private JTabbedPane tabbedPane;
    private BorderLayout layout;
    private JPanel card1;
    private JPanel card2;
    private JPanel bottom;

    ConfigMenu(final Controller controller, final View view) {

        this.controller = controller;
        this.view = view;

        menu = new JDialog(view);
        icon = UIManager.getIcon("FileView.floppyDriveIcon");

        downloadLabel = new JLabel("Lokalizacja pobranych plików");
        downloadPath = new JTextField(controller.doGetDownloadPath());
        downloadSelectButton = new JButton(icon);
        downloadLabel.setPreferredSize(new Dimension(280, 30));
        downloadPath.setPreferredSize(new Dimension(235, 30));
        downloadPath.setEnabled(false);
        downloadSelectButton.setPreferredSize(new Dimension(30, 30));
        downloadSelectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                chooser.setAcceptAllFileFilterUsed(false);
                int ret_code = chooser.showDialog(menu, "Wybierz katalog");
                if (ret_code == JFileChooser.APPROVE_OPTION) {
                    if (chooser.getSelectedFile().canWrite()) {
                        downloadPath.setText(chooser.getSelectedFile().getAbsolutePath());
                    } else {
                        view.showError("Nie można zapisać w podanym katalogu.");
                    }
                }
            }
        });


        credentials = new JLabel("Ściezka do pliku z danymi konta");
        credentialsPath = new JTextField(controller.doGetLoginInfoPath());

        selectButton = new JButton(icon);
        acceptButton = new JButton("Zatwierdź");
        menu.setLocationRelativeTo(view);

        credentials.setToolTipText("Zmiana bedzie aktywowana po ponownym zalogowaniu!");
        credentials.setPreferredSize(new Dimension(280, 30));
        credentialsPath.setPreferredSize(new Dimension(235, 30));
        credentialsPath.setEnabled(false);
        selectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.setAcceptAllFileFilterUsed(false);
                FileNameExtensionFilter config_filter = new FileNameExtensionFilter("JSON file", "json");
                chooser.setFileFilter(config_filter);
                int ret_code = chooser.showDialog(menu, "Wybierz");
                if (ret_code == JFileChooser.APPROVE_OPTION) {


                    if (chooser.getSelectedFile().canRead()) {
                        credentialsPath.setText(chooser.getSelectedFile().getAbsolutePath());
                    } else {
                        view.showError("Nie można odczytać pliku konfiguracyjnego");
                    }
                }
            }
        });
        selectButton.setPreferredSize(new Dimension(30, 30));

        menu.getRootPane().setDefaultButton(acceptButton);
        acceptButton.setToolTipText("Zapisz i zamknij okno konfiguracji");
        acceptButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (credentialsPath.getText() == null || credentialsPath.getText().equals("")) {
                    view.showError("Ścieżka do pliku konfiguracyjnego nie może być pusta!");
                } else {
                    if (!controller.doGetLoginInfoPath().equals(credentialsPath.getText())) {
                        controller.doUpdateConfigPath(credentialsPath.getText());
                    }
                    if (!controller.doGetDownloadPath().equals(downloadPath.getText())) {
                        controller.doUpdateDownloadPath(downloadPath.getText());
                    }
                    menu.dispose();
                    view.setConfigMenuEnabled();
                }

            }
        });
        cancel = new JButton("Anuluj");
        cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                menu.dispose();
                view.setConfigMenuEnabled();
            }
        });
        tabbedPane = new JTabbedPane();
        layout = new BorderLayout();
        card1 = new JPanel(new FlowLayout());
        card2 = new JPanel(new FlowLayout());
        bottom = new JPanel(new FlowLayout());
        bottom.add(acceptButton);
        bottom.add(cancel);
        menu.setLayout(layout);
        tabbedPane.addTab("Autoryzacja", card1);
        tabbedPane.addTab("Pobieranie", card2);
        card1.add(credentials);
        card1.add(credentialsPath);
        card1.add(selectButton);
        card2.add(downloadLabel);
        card2.add(downloadPath);
        card2.add(downloadSelectButton);

        menu.add(tabbedPane, layout.CENTER);
        menu.add(bottom, layout.SOUTH);
        menu.setSize(300, 300);
        menu.setTitle("Konfiguracja");
        menu.setVisible(true);
        menu.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                view.setConfigMenuEnabled();
            }
        });
    }
}
